home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / ui_preferences.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  13.5 KB  |  382 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. /*
  4. =======================================================================
  5.  
  6. GAME OPTIONS MENU
  7.  
  8. =======================================================================
  9. */
  10.  
  11.  
  12. #include "ui_local.h"
  13.  
  14.  
  15. #define ART_FRAMEL                "menu/art/frame2_l"
  16. #define ART_FRAMER                "menu/art/frame1_r"
  17. #define ART_BACK0                "menu/art/back_0"
  18. #define ART_BACK1                "menu/art/back_1"
  19.  
  20. #define PREFERENCES_X_POS        360
  21.  
  22. #define ID_CROSSHAIR            127
  23. #define ID_SIMPLEITEMS            128
  24. #define ID_HIGHQUALITYSKY        129
  25. #define ID_EJECTINGBRASS        130
  26. #define ID_WALLMARKS            131
  27. #define ID_DYNAMICLIGHTS        132
  28. #define ID_IDENTIFYTARGET        133
  29. #define ID_SYNCEVERYFRAME        134
  30. #define ID_FORCEMODEL            135
  31. #define ID_DRAWTEAMOVERLAY        136
  32. #define ID_BACK                    137
  33.  
  34. #define    NUM_CROSSHAIRS            10
  35.  
  36.  
  37. typedef struct {
  38.     menuframework_s        menu;
  39.  
  40.     menutext_s            banner;
  41.     menubitmap_s        framel;
  42.     menubitmap_s        framer;
  43.  
  44.     menulist_s            crosshair;
  45.     menuradiobutton_s    simpleitems;
  46.     menuradiobutton_s    brass;
  47.     menuradiobutton_s    wallmarks;
  48.     menuradiobutton_s    dynamiclights;
  49.     menuradiobutton_s    identifytarget;
  50.     menuradiobutton_s    highqualitysky;
  51.     menuradiobutton_s    synceveryframe;
  52.     menuradiobutton_s    forcemodel;
  53.     menulist_s            drawteamoverlay;
  54.     menubitmap_s        back;
  55.  
  56.     qhandle_t            crosshairShader[NUM_CROSSHAIRS];
  57. } preferences_t;
  58.  
  59. static preferences_t s_preferences;
  60.  
  61. static const char *teamoverlay_names[] =
  62. {
  63.     "off",
  64.     "upper right",
  65.     "lower right",
  66.     "lower left",
  67.     0
  68. };
  69.  
  70. static void Preferences_SetMenuItems( void ) {
  71.     s_preferences.crosshair.curvalue        = (int)trap_Cvar_VariableValue( "cg_drawCrosshair" ) % NUM_CROSSHAIRS;
  72.     s_preferences.simpleitems.curvalue        = trap_Cvar_VariableValue( "cg_simpleItems" ) != 0;
  73.     s_preferences.brass.curvalue            = trap_Cvar_VariableValue( "cg_brassTime" ) != 0;
  74.     s_preferences.wallmarks.curvalue        = trap_Cvar_VariableValue( "cg_marks" ) != 0;
  75.     s_preferences.identifytarget.curvalue    = trap_Cvar_VariableValue( "cg_drawCrosshairNames" ) != 0;
  76.     s_preferences.dynamiclights.curvalue    = trap_Cvar_VariableValue( "r_dynamiclight" ) != 0;
  77.     s_preferences.highqualitysky.curvalue    = trap_Cvar_VariableValue ( "r_fastsky" ) == 0;
  78.     s_preferences.synceveryframe.curvalue    = trap_Cvar_VariableValue( "r_finish" ) != 0;
  79.     s_preferences.forcemodel.curvalue        = trap_Cvar_VariableValue( "cg_forcemodel" ) != 0;
  80.     s_preferences.drawteamoverlay.curvalue    = Com_Clamp( 0, 3, trap_Cvar_VariableValue( "cg_drawTeamOverlay" ) );
  81. }
  82.  
  83.  
  84. static void Preferences_Event( void* ptr, int notification ) {
  85.     if( notification != QM_ACTIVATED ) {
  86.         return;
  87.     }
  88.  
  89.     switch( ((menucommon_s*)ptr)->id ) {
  90.     case ID_CROSSHAIR:
  91.         s_preferences.crosshair.curvalue++;
  92.         if( s_preferences.crosshair.curvalue == NUM_CROSSHAIRS ) {
  93.             s_preferences.crosshair.curvalue = 0;
  94.         }
  95.         trap_Cvar_SetValue( "cg_drawCrosshair", s_preferences.crosshair.curvalue );
  96.         break;
  97.  
  98.     case ID_SIMPLEITEMS:
  99.         trap_Cvar_SetValue( "cg_simpleItems", s_preferences.simpleitems.curvalue );
  100.         break;
  101.  
  102.     case ID_HIGHQUALITYSKY:
  103.         trap_Cvar_SetValue( "r_fastsky", !s_preferences.highqualitysky.curvalue );
  104.         break;
  105.  
  106.     case ID_EJECTINGBRASS:
  107.         if ( s_preferences.brass.curvalue )
  108.             trap_Cvar_Reset( "cg_brassTime" );
  109.         else
  110.             trap_Cvar_SetValue( "cg_brassTime", 0 );
  111.         break;
  112.  
  113.     case ID_WALLMARKS:
  114.         trap_Cvar_SetValue( "cg_marks", s_preferences.wallmarks.curvalue );
  115.         break;
  116.  
  117.     case ID_DYNAMICLIGHTS:
  118.         trap_Cvar_SetValue( "r_dynamiclight", s_preferences.dynamiclights.curvalue );
  119.         break;        
  120.  
  121.     case ID_IDENTIFYTARGET:
  122.         trap_Cvar_SetValue( "cg_drawCrosshairNames", s_preferences.identifytarget.curvalue );
  123.         break;
  124.  
  125.     case ID_SYNCEVERYFRAME:
  126.         trap_Cvar_SetValue( "r_finish", s_preferences.synceveryframe.curvalue );
  127.         break;
  128.  
  129.     case ID_FORCEMODEL:
  130.         trap_Cvar_SetValue( "cg_forcemodel", s_preferences.forcemodel.curvalue );
  131.         break;
  132.  
  133.     case ID_DRAWTEAMOVERLAY:
  134.         trap_Cvar_SetValue( "cg_drawTeamOverlay", s_preferences.drawteamoverlay.curvalue );
  135.         break;
  136.  
  137.     case ID_BACK:
  138.         UI_PopMenu();
  139.         break;
  140.     }
  141. }
  142.  
  143.  
  144. /*
  145. =================
  146. Crosshair_Draw
  147. =================
  148. */
  149. static void Crosshair_Draw( void *self ) {
  150.     menulist_s    *s;
  151.     float        *color;
  152.     int            x, y;
  153.     int            style;
  154.     qboolean    focus;
  155.  
  156.     s = (menulist_s *)self;
  157.     x = s->generic.x;
  158.     y =    s->generic.y;
  159.  
  160.     style = UI_SMALLFONT;
  161.     focus = (s->generic.parent->cursor == s->generic.menuPosition);
  162.  
  163.     if ( s->generic.flags & QMF_GRAYED )
  164.         color = text_color_disabled;
  165.     else if ( focus )
  166.     {
  167.         color = text_color_highlight;
  168.         style |= UI_PULSE;
  169.     }
  170.     else if ( s->generic.flags & QMF_BLINK )
  171.     {
  172.         color = text_color_highlight;
  173.         style |= UI_BLINK;
  174.     }
  175.     else
  176.         color = text_color_normal;
  177.  
  178.     if ( focus )
  179.     {
  180.         // draw cursor
  181.         UI_FillRect( s->generic.left, s->generic.top, s->generic.right-s->generic.left+1, s->generic.bottom-s->generic.top+1, listbar_color ); 
  182.         UI_DrawChar( x, y, 13, UI_CENTER|UI_BLINK|UI_SMALLFONT, color);
  183.     }
  184.  
  185.     UI_DrawString( x - SMALLCHAR_WIDTH, y, s->generic.name, style|UI_RIGHT, color );
  186.     if( !s->curvalue ) {
  187.         return;
  188.     }
  189.     UI_DrawHandlePic( x + SMALLCHAR_WIDTH, y - 4, 24, 24, s_preferences.crosshairShader[s->curvalue] );
  190. }
  191.  
  192.  
  193. static void Preferences_MenuInit( void ) {
  194.     int                y;
  195.  
  196.     memset( &s_preferences, 0 ,sizeof(preferences_t) );
  197.  
  198.     Preferences_Cache();
  199.  
  200.     s_preferences.menu.wrapAround = qtrue;
  201.     s_preferences.menu.fullscreen = qtrue;
  202.  
  203.     s_preferences.banner.generic.type  = MTYPE_BTEXT;
  204.     s_preferences.banner.generic.x       = 320;
  205.     s_preferences.banner.generic.y       = 16;
  206.     s_preferences.banner.string           = "GAME OPTIONS";
  207.     s_preferences.banner.color         = color_white;
  208.     s_preferences.banner.style         = UI_CENTER;
  209.  
  210.     s_preferences.framel.generic.type  = MTYPE_BITMAP;
  211.     s_preferences.framel.generic.name  = ART_FRAMEL;
  212.     s_preferences.framel.generic.flags = QMF_INACTIVE;
  213.     s_preferences.framel.generic.x       = 0;
  214.     s_preferences.framel.generic.y       = 78;
  215.     s_preferences.framel.width         = 256;
  216.     s_preferences.framel.height         = 329;
  217.  
  218.     s_preferences.framer.generic.type  = MTYPE_BITMAP;
  219.     s_preferences.framer.generic.name  = ART_FRAMER;
  220.     s_preferences.framer.generic.flags = QMF_INACTIVE;
  221.     s_preferences.framer.generic.x       = 376;
  222.     s_preferences.framer.generic.y       = 76;
  223.     s_preferences.framer.width         = 256;
  224.     s_preferences.framer.height         = 334;
  225.  
  226.     y = 175;
  227.     s_preferences.crosshair.generic.type        = MTYPE_TEXT;
  228.     s_preferences.crosshair.generic.flags        = QMF_PULSEIFFOCUS|QMF_SMALLFONT|QMF_NODEFAULTINIT|QMF_OWNERDRAW;
  229.     s_preferences.crosshair.generic.x            = PREFERENCES_X_POS;
  230.     s_preferences.crosshair.generic.y            = y;
  231.     s_preferences.crosshair.generic.name        = "Crosshair:";
  232.     s_preferences.crosshair.generic.callback    = Preferences_Event;
  233.     s_preferences.crosshair.generic.ownerdraw    = Crosshair_Draw;
  234.     s_preferences.crosshair.generic.id            = ID_CROSSHAIR;
  235.     s_preferences.crosshair.generic.top            = y - 4;
  236.     s_preferences.crosshair.generic.bottom        = y + 20;
  237.     s_preferences.crosshair.generic.left        = PREFERENCES_X_POS - ( ( strlen(s_preferences.crosshair.generic.name) + 1 ) * SMALLCHAR_WIDTH );
  238.     s_preferences.crosshair.generic.right        = PREFERENCES_X_POS + 48;
  239.  
  240.     y += BIGCHAR_HEIGHT+2+4;
  241.     s_preferences.simpleitems.generic.type        = MTYPE_RADIOBUTTON;
  242.     s_preferences.simpleitems.generic.name          = "Simple Items:";
  243.     s_preferences.simpleitems.generic.flags          = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  244.     s_preferences.simpleitems.generic.callback    = Preferences_Event;
  245.     s_preferences.simpleitems.generic.id          = ID_SIMPLEITEMS;
  246.     s_preferences.simpleitems.generic.x              = PREFERENCES_X_POS;
  247.     s_preferences.simpleitems.generic.y              = y;
  248.  
  249.     y += BIGCHAR_HEIGHT+2+4;
  250.     s_preferences.wallmarks.generic.type          = MTYPE_RADIOBUTTON;
  251.     s_preferences.wallmarks.generic.name          = "Marks on Walls:";
  252.     s_preferences.wallmarks.generic.flags          = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  253.     s_preferences.wallmarks.generic.callback      = Preferences_Event;
  254.     s_preferences.wallmarks.generic.id            = ID_WALLMARKS;
  255.     s_preferences.wallmarks.generic.x              = PREFERENCES_X_POS;
  256.     s_preferences.wallmarks.generic.y              = y;
  257.  
  258.     y += BIGCHAR_HEIGHT+2;
  259.     s_preferences.brass.generic.type              = MTYPE_RADIOBUTTON;
  260.     s_preferences.brass.generic.name              = "Ejecting Brass:";
  261.     s_preferences.brass.generic.flags              = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  262.     s_preferences.brass.generic.callback          = Preferences_Event;
  263.     s_preferences.brass.generic.id                = ID_EJECTINGBRASS;
  264.     s_preferences.brass.generic.x                  = PREFERENCES_X_POS;
  265.     s_preferences.brass.generic.y                  = y;
  266.  
  267.     y += BIGCHAR_HEIGHT+2;
  268.     s_preferences.dynamiclights.generic.type      = MTYPE_RADIOBUTTON;
  269.     s_preferences.dynamiclights.generic.name      = "Dynamic Lights:";
  270.     s_preferences.dynamiclights.generic.flags     = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  271.     s_preferences.dynamiclights.generic.callback  = Preferences_Event;
  272.     s_preferences.dynamiclights.generic.id        = ID_DYNAMICLIGHTS;
  273.     s_preferences.dynamiclights.generic.x          = PREFERENCES_X_POS;
  274.     s_preferences.dynamiclights.generic.y          = y;
  275.  
  276.     y += BIGCHAR_HEIGHT+2;
  277.     s_preferences.identifytarget.generic.type     = MTYPE_RADIOBUTTON;
  278.     s_preferences.identifytarget.generic.name      = "Identify Target:";
  279.     s_preferences.identifytarget.generic.flags    = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  280.     s_preferences.identifytarget.generic.callback = Preferences_Event;
  281.     s_preferences.identifytarget.generic.id       = ID_IDENTIFYTARGET;
  282.     s_preferences.identifytarget.generic.x          = PREFERENCES_X_POS;
  283.     s_preferences.identifytarget.generic.y          = y;
  284.  
  285.     y += BIGCHAR_HEIGHT+2;
  286.     s_preferences.highqualitysky.generic.type     = MTYPE_RADIOBUTTON;
  287.     s_preferences.highqualitysky.generic.name      = "High Quality Sky:";
  288.     s_preferences.highqualitysky.generic.flags      = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  289.     s_preferences.highqualitysky.generic.callback = Preferences_Event;
  290.     s_preferences.highqualitysky.generic.id       = ID_HIGHQUALITYSKY;
  291.     s_preferences.highqualitysky.generic.x          = PREFERENCES_X_POS;
  292.     s_preferences.highqualitysky.generic.y          = y;
  293.  
  294.     y += BIGCHAR_HEIGHT+2;
  295.     s_preferences.synceveryframe.generic.type     = MTYPE_RADIOBUTTON;
  296.     s_preferences.synceveryframe.generic.name      = "Sync Every Frame:";
  297.     s_preferences.synceveryframe.generic.flags      = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  298.     s_preferences.synceveryframe.generic.callback = Preferences_Event;
  299.     s_preferences.synceveryframe.generic.id       = ID_SYNCEVERYFRAME;
  300.     s_preferences.synceveryframe.generic.x          = PREFERENCES_X_POS;
  301.     s_preferences.synceveryframe.generic.y          = y;
  302.  
  303.     y += BIGCHAR_HEIGHT+2;
  304.     s_preferences.forcemodel.generic.type     = MTYPE_RADIOBUTTON;
  305.     s_preferences.forcemodel.generic.name      = "Force Player Models:";
  306.     s_preferences.forcemodel.generic.flags      = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  307.     s_preferences.forcemodel.generic.callback = Preferences_Event;
  308.     s_preferences.forcemodel.generic.id       = ID_FORCEMODEL;
  309.     s_preferences.forcemodel.generic.x          = PREFERENCES_X_POS;
  310.     s_preferences.forcemodel.generic.y          = y;
  311.  
  312.     y += BIGCHAR_HEIGHT+2;
  313.     s_preferences.drawteamoverlay.generic.type     = MTYPE_SPINCONTROL;
  314.     s_preferences.drawteamoverlay.generic.name       = "Draw Team Overlay:";
  315.     s_preferences.drawteamoverlay.generic.flags       = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  316.     s_preferences.drawteamoverlay.generic.callback = Preferences_Event;
  317.     s_preferences.drawteamoverlay.generic.id       = ID_DRAWTEAMOVERLAY;
  318.     s_preferences.drawteamoverlay.generic.x           = PREFERENCES_X_POS;
  319.     s_preferences.drawteamoverlay.generic.y           = y;
  320.     s_preferences.drawteamoverlay.itemnames            = teamoverlay_names;
  321.  
  322.     y += BIGCHAR_HEIGHT+2;
  323.     s_preferences.back.generic.type        = MTYPE_BITMAP;
  324.     s_preferences.back.generic.name     = ART_BACK0;
  325.     s_preferences.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  326.     s_preferences.back.generic.callback = Preferences_Event;
  327.     s_preferences.back.generic.id        = ID_BACK;
  328.     s_preferences.back.generic.x        = 0;
  329.     s_preferences.back.generic.y        = 480-64;
  330.     s_preferences.back.width              = 128;
  331.     s_preferences.back.height              = 64;
  332.     s_preferences.back.focuspic         = ART_BACK1;
  333.  
  334.     Menu_AddItem( &s_preferences.menu, &s_preferences.banner );
  335.     Menu_AddItem( &s_preferences.menu, &s_preferences.framel );
  336.     Menu_AddItem( &s_preferences.menu, &s_preferences.framer );
  337.  
  338.     Menu_AddItem( &s_preferences.menu, &s_preferences.crosshair );
  339.     Menu_AddItem( &s_preferences.menu, &s_preferences.simpleitems );
  340.     Menu_AddItem( &s_preferences.menu, &s_preferences.wallmarks );
  341.     Menu_AddItem( &s_preferences.menu, &s_preferences.brass );
  342.     Menu_AddItem( &s_preferences.menu, &s_preferences.dynamiclights );
  343.     Menu_AddItem( &s_preferences.menu, &s_preferences.identifytarget );
  344.     Menu_AddItem( &s_preferences.menu, &s_preferences.highqualitysky );
  345.     Menu_AddItem( &s_preferences.menu, &s_preferences.synceveryframe );
  346.     Menu_AddItem( &s_preferences.menu, &s_preferences.forcemodel );
  347.     Menu_AddItem( &s_preferences.menu, &s_preferences.drawteamoverlay );
  348.  
  349.     Menu_AddItem( &s_preferences.menu, &s_preferences.back );
  350.  
  351.     Preferences_SetMenuItems();
  352. }
  353.  
  354.  
  355. /*
  356. ===============
  357. Preferences_Cache
  358. ===============
  359. */
  360. void Preferences_Cache( void ) {
  361.     int        n;
  362.  
  363.     trap_R_RegisterShaderNoMip( ART_FRAMEL );
  364.     trap_R_RegisterShaderNoMip( ART_FRAMER );
  365.     trap_R_RegisterShaderNoMip( ART_BACK0 );
  366.     trap_R_RegisterShaderNoMip( ART_BACK1 );
  367.     for( n = 0; n < NUM_CROSSHAIRS; n++ ) {
  368.         s_preferences.crosshairShader[n] = trap_R_RegisterShaderNoMip( va("gfx/2d/crosshair%c", 'a' + n ) );
  369.     }
  370. }
  371.  
  372.  
  373. /*
  374. ===============
  375. UI_PreferencesMenu
  376. ===============
  377. */
  378. void UI_PreferencesMenu( void ) {
  379.     Preferences_MenuInit();
  380.     UI_PushMenu( &s_preferences.menu );
  381. }
  382.